package com.cy.config;


import com.cy.entity.SysUser;
import com.cy.mapper.SysUserMapper;
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.util.ByteSource;

import javax.annotation.Resource;
import java.util.List;

/**
 * 认证授权时 需要的DAO类
 * @author wxhn1
 */
public class MysqlRealm extends AuthorizingRealm {
    @Resource
    SysUserMapper userMapper;
    /**
     * 授权  检测需要验证角色和权限时会执行  每次检测执行一次
     * 加入缓存后仅执行一次
     */
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection p) {
        // 拿到登录时存储的对象
        SysUser user = (SysUser) p.getPrimaryPrincipal();
        List<String> roles = userMapper.getRoles(user.getUsername());
        // 授权返回
        SimpleAuthorizationInfo sa = new SimpleAuthorizationInfo();
        sa.addRoles(roles);
        return sa;
    }

    /**
     * 认证  登录时  自动执行
     */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken a) throws AuthenticationException {
        // 获取用户登录时 输入的用户名
        String yhm = (String) a.getPrincipal();
        // 去数据库查询该数据
        SysUser user = userMapper.getByUsername(yhm);
        // 检测账号是否存在
        if(user == null){
            throw new UnknownAccountException();
        }
        // 检测账号是否锁定  0正常 1锁定
        if(user.getSuo() == 1){
            throw new LockedAccountException();
        }
        // 获取数据库的盐
        ByteSource salt = ByteSource.Util.bytes(user.getSalt());
        // 存储对象 并返回数据库密码和登录的密码比较
        // 1.存储到会话内的数据 如果是对象 会被序列化后存储 也会保存至Cookie中
        // 2.数据库的密码   3. 当前域的名称
        SimpleAuthenticationInfo sa =
                new SimpleAuthenticationInfo(user,user.getPassword(),salt,getName());
        return sa;
    }
}
